#ifndef HASPTR_COPY_H
#define HASPTR_COPY_H

#include <string>

class Hasptr
{
private:
    std::string *ps;
    int i;
    std::size_t *use; // 用来记录有多少个对象共享 *ps 成员
public:
    // 构造函数分配新的 string 和新的计数器，将计数器置为 1
    Hasptr(const std::string &s = std::string()) :
           ps(new std::string(s)), i(0), use(new std::size_t()) { }
    // 拷贝构造函数拷贝所有三个数据成员，并递增计数器
    Hasptr(const Hasptr &p) : 
           ps(p.ps), i(p.i), use(p.use) { ++*use; }
    Hasptr& operator=(const Hasptr&);
    ~Hasptr();
};
/**
 * @brief Destroy the Hasptr:: Hasptr object
 * 
 */
Hasptr::~Hasptr()
{
    if(--*use == 0) // 如果引用计数为 0
    {
        delete ps; // 释放 string 内存
        delete use; // 释放计数器内存
    }
}
/**
 * @brief 
 * 
 * @param rhs 
 * @return Hasptr& 
 */
Hasptr& Hasptr::operator = (const Hasptr &rhs)
{
    ++*rhs.use; // 递增右侧运算对象的引用计数
    if(--*use == 0) // 然后递减本对象的引用计数
    {
        delete ps; // 如果没有其他用户
        delete use; // 释放本对象分配的成员
    }
    ps = rhs.ps; // 将数据从 rhs 拷贝到本对象
    i = rhs.i;
    use = rhs.use;
    return *this; // 返回本对象
}
#endif